/*!
 * \file ActionPolicyMgr.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief UFT动作策略管理器头文件，定义了交易动作类型和策略规则管理
 * 
 * \details 本文件包含超高频交易系统中的动作策略管理功能。
 *          ActionPolicyMgr类负责管理不同品种的交易动作策略规则，
 *          包括开仓、平仓等动作的限制条件和执行规则。
 *          支持基于品种的策略组配置和动态规则查找。
 */
#pragma once
#include <vector>
#include <stdint.h>
#include <string.h>

#include "../Includes/FasterDefs.h"


NS_WTP_BEGIN
class WTSVariant;

/*!
 * \enum tagActionType
 * \brief 交易动作类型枚举
 * 
 * \details 定义了超高频交易系统中支持的各种交易动作类型
 */
typedef enum tagActionType
{
	AT_Unknown = 8888,		///<未知动作类型
	AT_Open = 9999,			///<开仓动作
	AT_Close,				///<平仓动作
	AT_CloseToday,			///<平今动作
	AT_CloseYestoday		///<平昨动作
} ActionType;

/*!
 * \struct _ActionRule
 * \brief 动作规则结构体
 * 
 * \details 定义单个交易动作的执行规则，包括动作类型、数量限制等参数
 */
typedef struct _ActionRule
{
	ActionType	_atype;		///<动作类型
	uint32_t	_limit;		///<总数量限制
	uint32_t	_limit_l;	///<多头数量限制
	uint32_t	_limit_s;	///<空头数量限制
	bool		_pure;		///<主要用于AT_CloseToday和AT_CloseYestoday，用来判断是否是纯净只平今或纯净只平昨

	/*!
	 * \brief 构造函数，初始化所有字段为0
	 */
	_ActionRule()
	{
		memset(this, 0, sizeof(_ActionRule));
	}
} ActionRule;

typedef std::vector<ActionRule>	ActionRuleGroup;

/*!
 * \class ActionPolicyMgr
 * \brief 动作策略管理器类
 * 
 * \details 负责管理超高频交易系统中的动作策略规则：
 *          - 从配置文件加载策略规则
 *          - 管理不同品种的策略组
 *          - 提供基于品种ID的规则查找
 *          - 支持默认规则组和品种特定规则组
 *          - 控制交易动作的执行限制和条件
 * 
 * \note 策略规则用于控制交易频率和风险管理
 * \warning 规则配置错误可能导致交易异常
 */
class ActionPolicyMgr
{
public:
	/*!
	 * \brief 构造函数
	 */
	ActionPolicyMgr();
	
	/*!
	 * \brief 析构函数
	 */
	~ActionPolicyMgr();

public:
	/*!
	 * \brief 初始化策略管理器
	 * \param filename 配置文件路径
	 * \return 初始化成功返回true，失败返回false
	 * 
	 * \details 从配置文件加载动作策略规则，解析策略组和过滤条件。
	 *          配置文件应包含策略组定义、动作规则和品种过滤器。
	 */
	bool init(const char* filename);

	/*!
	 * \brief 获取指定品种的动作规则组
	 * \param pid 品种ID或合约代码
	 * \return 返回对应的动作规则组引用
	 * 
	 * \details 根据品种ID查找对应的策略规则组。
	 *          如果找不到特定品种的规则，将返回默认规则组。
	 *          查找顺序：品种特定规则 -> 默认规则组。
	 */
	const ActionRuleGroup& getActionRules(const char* pid);

private:
	typedef faster_hashmap<ShortKey, ActionRuleGroup> RulesMap;
	RulesMap	_rules;										///<策略规则映射

	faster_hashmap<ShortKey, std::string> _comm_rule_map;	///<品种规则映射表
};

NS_WTP_END
